package jtierno.organizadorMaterias.controller;

import java.util.Arrays;
import java.util.List;

import jtierno.organizadorMaterias.model.CorrelativasMateria;
import jtierno.organizadorMaterias.model.Estado;
import jtierno.organizadorMaterias.model.Materia;

import org.apache.commons.collections.CollectionUtils;

import edu.uci.ics.jung.graph.DirectedSparseGraph;
import edu.uci.ics.jung.graph.Graph;

public class MateriasController {

	private List<Materia> materias;
	private CorrelativasMateria correlativas;
	private Graph<Materia, Integer> grafo;

	public MateriasController() {
		Materia CBC = crearMateria("CBC", "CBC", 38);
		Materia m6103 = crearMateria("Analisis II", "61.03", 8);
		Materia m6201 = crearMateria("Fisica I", "62.01", 8);
		Materia m7540 = crearMateria("Algoritmos I", "75.40", 6);
		Materia m6108 = crearMateria("Álgebra II", "61.08", 8);
		Materia m6203 = crearMateria("Fisica II", "62.03", 8);
		Materia m6301 = crearMateria("Química", "63.01", 6);
		Materia m7541 = crearMateria("Algoritmos II", "75.41", 6);
		Materia m6215 = crearMateria("Fisica III", "62.15", 4);
		Materia m6602 = crearMateria("Laboratorio", "66.02", 6);
		Materia m6670 = crearMateria("Estructura", "66.70", 6);
		Materia m7507 = crearMateria("Algoritmos III", "75.07", 6);
		Materia m7512 = crearMateria("Numérico I", "75.12", 6);
		Materia m6109 = crearMateria("Proba B", "61.09", 6);
		Materia m6110 = crearMateria("Analisis IIIA", "61.10", 6);
		Materia m6620 = crearMateria("Orga Comp", "66.20", 6);
		Materia m7506 = crearMateria("Datos", "75.06", 6);
		Materia m7542 = crearMateria("Taller I", "75.42", 4);
		Materia m7112 = crearMateria("Estrc Org", "71.12", 6);
		Materia m7114 = crearMateria("Modelos I", "71.14", 6);
		Materia m7508 = crearMateria("SO", "75.08", 6);
		Materia m7509 = crearMateria("Analisis Info", "75.09", 6);

		Materia m7510 = crearMateria("Téc Diseño", "75.10", 6);
		Materia m7515 = crearMateria("BBDD", "75.15", 6);
		Materia m7543 = crearMateria("Intr a distr", "75.43", 6);
		Materia m7552 = crearMateria("Taller II", "75.52", 4);

		materias = Arrays.asList(CBC, m6103, m6201, m7540, m6108, m6203, m6301,
				m7541, m7507, m7512, m6109, m6110, m6215, m6602, m6620, m6670,
				m7112, m7114, m7506, m7508, m7509, m7542);
		// materias = Arrays.asList(CBC, m6103, m6201,m7540, m6301);
		correlativas = new CorrelativasMateria();
		correlativas.agregarCorrelatividad(CBC,
				Arrays.asList(m6103, m6201, m7540, m6301));
		correlativas.agregarCorrelatividad(m6103,
				Arrays.asList(m6203, m7512, m6109, m6110));
		correlativas.agregarCorrelatividad(m6201, Arrays.asList(m6203));
		correlativas.agregarCorrelatividad(m7540, Arrays.asList(m7541));
		correlativas.agregarCorrelatividad(m6108,
				Arrays.asList(m6215, m6670, m7512, m6109, m6110));
		correlativas.agregarCorrelatividad(m6203,
				Arrays.asList(m6215, m6602, m6670, m7114));
		correlativas.agregarCorrelatividad(m6301, Arrays.asList(m6215, m7114));
		correlativas.agregarCorrelatividad(m7541,
				Arrays.asList(m6670, m7507, m7512, m7506, m7542));
		correlativas.agregarCorrelatividad(m6602, Arrays.asList(m6620));
		correlativas.agregarCorrelatividad(m6670,
				Arrays.asList(m6620, m7506, m7542));
		correlativas.agregarCorrelatividad(m7512, Arrays.asList(m7542));
		correlativas.agregarCorrelatividad(m6110, Arrays.asList(m7114));
		correlativas.agregarCorrelatividad(m7506,
				Arrays.asList(m7112, m7508, m7515));
		correlativas.agregarCorrelatividad(m7542,
				Arrays.asList(m7114, m7509, m7552));
		correlativas.agregarCorrelatividad(m7508, Arrays.asList(m7510, m7543));
		correlativas.agregarCorrelatividad(m7509, Arrays.asList(m7510, m7515));
		correlativas.agregarCorrelatividad(m6620, Arrays.asList(m7543));
		correlativas.agregarCorrelatividad(m6215, Arrays.asList(m7543));
		correlativas.agregarCorrelatividad(m7114, Arrays.asList(m7552));
		correlativas.agregarCorrelatividad(m7507, Arrays.asList(m7552));

		CBC.setEstado(Estado.APROBADA);
		m6103.setEstado(Estado.APROBADA);
		m6201.setEstado(Estado.APROBADA);
		m7540.setEstado(Estado.APROBADA);
		m6108.setEstado(Estado.APROBADA);
		m6203.setEstado(Estado.APROBADA);
		m6301.setEstado(Estado.APROBADA);
		m7541.setEstado(Estado.APROBADA);
		m7507.setEstado(Estado.APROBADA);
		m7512.setEstado(Estado.APROBADA);
		grafo = crearGrafo();
	}

	private static Materia crearMateria(String desc, String codigo, int creditos) {
		Materia materia = new Materia();
		materia.setDescripcion(desc);
		materia.setCodigo(codigo);
		materia.setCreditos(creditos);
		return materia;
	}

	public List<Materia> getMaterias() {
		return materias;
	}

	public Graph<Materia, Integer> getGrafo() {
		return grafo;
	}

	private Graph<Materia, Integer> crearGrafo() {
		Graph<Materia, Integer> grafo = new DirectedSparseGraph<Materia, Integer>();
		for (Materia materia : materias) {
			grafo.addVertex(materia);
		}
		int i = 0;
		for (Materia raiz : materias) {
			List<Materia> correlativasMateria = correlativas
					.getCorrelativas(raiz);
			if (CollectionUtils.isNotEmpty(correlativasMateria)) {
				for (Materia correlativa : correlativasMateria) {
					grafo.addEdge(i++, raiz, correlativa);
				}
			}
		}
		return grafo;
	}
}
